//
// Created by JYL on 2024-06-22.
//

#ifndef WHEELTEC_APP_H
#define WHEELTEC_APP_H

#include "main.h"
#include "cmsis_os.h"
#include "uart_task.h"

extern osEventFlagsId_t myEvent_AppHandle;      //事件通知没有信号量及时
extern osSemaphoreId_t myBinarySem_carHandle;
extern osTimerId_t myTimer_carHandle;

//蓝牙控制模式定义
#define AUTO    1
#define MANUAL  0

//状态延时事件管理
#define TURN_90_DELAY       850     //转90°需要的时间
#define CROSS_T_DELAY       550     //看到路口，巡线延时（为了停在路口中央）
#define CORNER_N_DELAY      550     //看到尽头，巡线延时（为了停在黑色虚线）

//事件标志组变量存储结构(当串口任务不方便判断下一个状态，应当通知状态机任务并返回)
#define EVENT_UART_SEND_NUM         0x01    //串口发送数字
#define EVENT_K210_FIND_TURN        0x02    //摄像头识别路口
#define EVENT_K210_FIND_END         0x03    //摄像头识别尽头



//TODO
// 1.利用状态机，测试完成小车行为，
// 2.数字1~8，就是多个状态的组合
// 列如：1=Wait+Forward+Left_90+Forward+Arrive+Turn_180
typedef enum{
    Wait=0,     //等待指令（出发前）
    Line,       //巡线（开始巡线）
    L_90,       //左转：Delay到90°
    R_90,       //右转：Delay到90°
    T_180,      //调头：Delay到180°
    Cross,      //发现十字路口：Delay到路口
    Corner,     //发现路口尽头：Delay到尽头
}CarAction;      //小车返航的路线可以反过来用
extern CarAction action;


typedef struct {//送药标志位(一旦开始，不可修改成其他数字，但是可以取消送药任务)
    _Bool Control_flag;     //控制模式（Auto/Manual）
    uint8_t state;
    uint8_t index;  //用于二维数组记录弯道的索引
    uint8_t Number_mode;    //0:Null    (1~8)开始送药
    uint8_t Turn_mode;     //转弯标志位(0:Line-1:Left-2:Right-3:Turn)
    uint8_t Remains_turn;//剩余路口
}APP;
extern APP app;

void Application(uint8_t state);

#endif //WHEELTEC_APP_H
